"""
'''
函数作业：
    1.定义一个函数，用于输入省份和城市的数据
    2.再定义一个函数，用于输出省份和城市的数据
定义函数---def
输入---input
局部作用域：定义在函数中的变量拥有局部作用域，只能在定义它的函数中使用

其他函数想要用到funa中的变量的话是有两种方法的
方法一：return 将值返回到函数调用处

return 值---将值返回到函数调用处
return 值，值---将多个值返回到函数调用处
'''
#第一种方法：使用return 将元素返回在调用处
def funa():
    sf=input("请输入省份")
    cs=input("请输入城市")
    return sf,cs

def funb():
    #因为我们在funa中已经将这个sf和cs进行返回了，返回到调用处，用的是元组的形式
    #那么我们就需要使用变量进行拆包接受
    sf,cs=funa()
    #元组的拆包操作
    #对于这个拆包的话，无异于sf,cs=(省份，城市)
    print(f"{sf}省{cs}市")
print(funa())
##funa()
funb()
#因为funb里面有这个funa函数的调用了，那么我们就直接调用这个funb函数就行了

#第二个方法
#使用global---声明的局部作用域的变量为全局作用域

def testa():
    global s,c#直接让这两个变量变为全局变量
    s=input("请输入省份")
    c=input("请输入城市")
def testb():
    print(f"{s}省{c}市")
testa()
testb()

'''
这两种方法的话我们使用这个s,c在交互模式的话我们仍然能获取到值
但是我们的return 的方法只有调用函数才能获取到里面的值
因为return的方法中这城市和省份两个变量是局部的
'''
"""




'''
类的作业：
    定义一个计算器类，拥有加、减、乘、除，
    调用方法时传入要进行计算的数字
'''
"""
class Number:
    def __init__(self,n):
        self.n=n#进行初始化操作
        if'+'in self.n:#成员函数
            #要执行加法操作，我们进行拆分的操作，以加号进行拆分的操作
            l=self.n.split('+')#以+进行分割，然后得到的一个列表
            self.li=l#进行数据的存放
            self.add()#进行加法函数的调用
        elif '-'in self.n:
            self.li=self.n.split('-')
            self.subt()
        elif '*'in self.n:
            self.li=self.n.split('*')
            self.mult()
        elif '/'in self.n:
            self.li=self.n.split('/')
            self.divi()

            
    def add(self):#加
        s=0#利用循环将这个列表中的数据进行累加的操作
        for i in self.li:#遍历这个列表中的数据
            s+=eval(i)#这个i是字符哦
        print(f'{self.n}={s}')
    def subt(self):#减
        s=eval(self.li[0])#设置初始值为第一个数
        for i in self.li[1:]:
            s-=eval(i)
        print(f'{self.n}={s}')
#这里的1后面有个冒号，这是一个切片的操作

##self.li[1:] 表示从列表的第二个元素（索引为1的元素）开始，
##一直到列表的末尾。索引从0开始计数，所以索引为1的元素是列表中的第二个元素。
##这里的冒号 : 是切片操作的一部分，表示从索引1开始，一直到列表的末尾。如果不写冒号，
##Python会报错，因为它需要明确知道切片的开始和结束位置。

    def mult(self):#乘
        s=1
        for i in self.li:
            s*=eval(i)
        print(f'{self.n}={s}')
    def divi(self):#除
        s=eval(self.li[0])#设置初始值为第一个数
        for i in self.li[1:]:
            s/=eval(i)
        print(f'{self.n}={s}')

n=input("请输入要执行的计算")#直接输入这种算术的:1+1  2+2
Number(n)
"""
#对于我们输入的算术表达式我们通过成员运算符取判断该使用哪种方法
#'+' in '1+1'

#self用于在__init__方法中将传入的值n进行处理，并将其拆分后的结果存储
#在实例的属性self.a和self.b中。这样，你就可以在类的其他方法中使用这些属性了。
'''
print(i)
            #['1', '1']
            #我们以加号进行拆分，得到加号两边的数据然后以列表的形式存在i中
            self.a=eval(i[0])#获取到这个列表里面拆分的第一个元素
            self.b=eval(i[1])
'''

#当你定义一个类的方法时，第一个参数通常是self，
#它代表类的一个实例。在类的方法内部，你可以使用self来访问类的属性和其他方法。
#



'''
对于这个我们调用这个加法函数来说
我们先将1+4传递给了n
然后n将值赋值给self.n
然后进行判断这个字符串有没有加号
然后进行加法操作
然后我们对这个
字符串进行拆分操作
得到的数据放到了列表中
然后我们调用加法操作
对于这个加法函数的话
我们内部是进行对这个列表的遍历
然后将每个字符剥离外面的引号得到里面的数据
然后进行累加的操作
然后进行这个结果的打印
'''

#这个我们是通过代码实现的
#我们也可以通过sum函数进行实现

#对于用户登录和用户注册我们是可以封装为两个函数的
"""
students =[
{'name':'张三','password':'123'},
{'name':'王五','password':'888'},
{'name':'赵六','password':'456'}
]
#用户登录---log
def log():
    name=input("请输入用户名：")
    for i in students:
    #i存在的是用户的信息字典
        if name==i['name']:
            #对输入的用户名进行判断
            for n in range(1,4):
                #循环3次进行输入密码的操作，如果输入正确直接跳出循环
                pwd=input("请输入密码：")
                if pwd==i['password']:
                    print('登录成功')
                     #exit()
                    break#只能退出当前所在的循环，就是跳出了里面的循环，还是处于外部循环
                else:
                    print(f'密码错误,还剩{3-n}次机会')
        if name==i['name'] and pwd==i['password'] :
            break
    else:
        print("用户名不存在，请先注册")
#用户注册---reg
def reg():
        name=input("请输入注册的用户名：")
        while True:
            p1=input("请输入密码：")
            p2=input("请再次输入密码：")
            if p1==p2:
                    students.append({'name':name,'password':p1})#p1是字符串我们得进行转换
                    print("注册成功")#那么我们就不用再输入密码了，我们就退出这个循环就行了
                    break
            else:
                print("两次密码要一致")
#直到我们输入正确的密码之后我们就能跳出这个循环了


while True:
    n=input('1.登录   2.注册   3.退出\n请输入你要操作的内容')
    if n =='1':
        log()
    elif n=='2':
        reg()
    elif n=='3':
        print("退出")
        break
    else:
        print("请输入正确的序号")
"""
'''
在类中定义变量进行数据的存放
就是属性：类属性、实例属性
区别：实例属性就是对象私有的，属于对象的变量，多个变量之间的变量值是不共享的
对象不同数据也就不同

用户信息存放的是每个用户的内容
每创建一个对象就相当于一个用户进行操作
'''


class Syste:
    #类属性的调用只能通过类名进行调用：类名.属性名
    users={'12345678910':{'pwd':'1234'},'123456':{'pwd':'1235'}}#这个电话号码是作为键的
    #存放用户信息
    #用户信息的存储格式为：键值对---字典:（电话号码为键，{pwd:密码}为值）
    def log(self):#登录
        tel=input("请输入你的电话号码：")
        if tel in Syste.users.keys():#这个keys()是进行字典中键的获取，我们这里通过成员运算符进行判断的操作
#类属性user我们必须通过类名才能进行调用的
            for i in range(1,4):
                p=input("请输入密码")
            #进行密码的判断，我们之前输入的电话tel就是键
            #我们需要先获取类中的字典，然后获取字典中的电话对应的密码
                if p==Syste.users[tel]['pwd']:#最后就拿到了电话号码了
                #用我们输入的密码和我们从user中取出的密码进行比较
                    print("登录成功")
                    break#登录成功之后我们直接跳出循环就行了
                else:
                    print(f"密码错误,还剩{3-i}")
        else:
            print("电话号码不存在，请先注册")
    def reg(self):#注册
        tel=input("请输入电话")
        if tel not in Syste.users.keys():#判断输入的电话号码是否不存在，不存在的话那么我们就进行注册
            #不存在进行注册的操作
            while True:#输入正确为止，我们就跳出循环
                p1=input("请输入密码")
                p2=input("请再次输入密码")
                if p1==p2:#两次密码一致，注册成功，将信息添加到用户信息中        
                    #字典的添加：字典[键]=值
                    Syste.users[tel]={'pwd':p1}
                    print("注册成功")
                    break#退出循环
                else:
                    print("两个密码不一致")                  
        else:
            #存在不能进行注册的操作
            print("用户名已经存在")

    def mod(self):#修改密码
        tel=input("请输入电话号码")
        if tel in Syste.users.keys():#判断输入的电话是否在之前就存在
            #存在的话就进行修改密码的操作
            while True:
                p1=input("请输入密码")
                p2=input("请再次输入密码")
                if p1==p2:
                    #字典的修改：字典[键]=值
                    Syste.users[tel]={'pwd':p1}
                    print("密码修改成功")
                    break
                else:
                    print("密码修改失败，请再次进行修改的操作")
        else:
            print('用户不存在')
    def __del__(self):#注销用户#将对应的用户信息进行删除键值对
        tel=input("请输入电话号码")
        if tel in Syste.users.keys():#判断输入的电话是否在之前就存在
            #存在注销掉
            for i in range(1,4):
                p=input("请输入密码")
            #进行密码的判断，我们之前输入的电话tel就是键
            #我们需要先获取类中的字典，然后获取字典中的电话对应的密码
                if p==Syste.users[tel]['pwd']:
                    #密码正确，进行用户的注销操作，去删除键值对---唯一性就是键，我们通过键进行删除的操作
                    #通过键删除键值对（popitem--删除最后一个键值对,pop(键)--=删除指定的键值对）

                    Syste.users.pop(tel)
                    print(f"{tel}注销成功了")
                    print("登录成功")
                    break#登录成功之后我们直接跳出循环就行了
                else:
                    print(f"密码错误,还剩{3-i}")
        else:
            print("用户不存在")

        
s1=Syste()
s1.mod()


'''
对于字典的添加和修改我们进行复习

字典的添加:字典[已经存在的键]=新值
字典的修改:字典[不存在的键]=新值


我们能直接通过类名进行元素的访问


我们通过pop(键)进行键值对的删除操作
'''










































































































